/**
 * 1.spring模块
 *      1.core模块
 *      2.data模块：jdbc，orm
 *      3.aop模块
 *      4.aspect模块
 *      5.message模块
 *      6.web模块
 *      7.test模块
 * 2.bean的生命周期
 *      1.bean容器利用java反射机制实例化bean
 *      2.给bean设置属性值
 *      3.检测aware接口，并且设置相关依赖，beanNameAware,beanClassLoaderAware,beanFactoryAwarea，applicationContextAwarea，执行他们的环境设置方法
 *      4.beanPostProcessor前置处理
 *      5.如果Bean定义初始化方法（PostConstruct注解、配置init-method、实现了InitializingBean接口），则执行定义的初始化方法
 *      7.BeanPostProcessor后置处理
 *      8.当要销毁这个Bean时，如果自定义了销毁方法（PreDestroy注解、配置destroy-method、实现了DisposableBean接口），则执行定义的销毁方法
 * 3.springMVC原理
 *      1.客户端发送请求，到dispatcherServlet
 *      2.dispatcherServlet去handlerMapping寻找对应的handler
 *      3.找到对应的handler由handlerAdapt执行对应的处理逻辑
 *      4.返回一个modelAndView，model是数据,view是一个逻辑视图
 *      5.通过viewResolve处理modelAndView，将model传给对应的view
 *      6.通过dispatcherServlet返回前端
 * 4.spring框架中用到的设计模式
 *      1.工程模式：beanFactory
 *      2.模板方法模式：jdbcTemplate,RedisTemplate
 *      3.适配器模式：HandlerAdapt
 *      4.代理模式：aop
 *      5.单例模式：bean
 * 5.什么是aop
 *      1.面向切面编程
 *      2.通过动态代理，在执行一个方法的前后加上一些自定义的业务逻辑
 *      3.项目中一般controller的日志，字典值的转换，或者有时候定义一些特殊service层方法的缓存用到，配合自定义注解
 * 6.spring如何解决循环依赖
 *      1.总述：运用三级的缓存列表来存储不同时期的Bean SingletonObjects EarlySingletonObjects SingletonFactories
 *      2.步骤：
 *          1.开始初始化对象A，这时候三级缓存都没有值
 *          2.调用A的构造，将A放入SingletonFactories
 *          3.开始注入A的依赖，发现A的依赖是B
 *          4.开始初始化对象B
 *          5.调用B的构造，将B放入SingletonFactories
 *          6.开始注入B的依赖，发现B依赖对象A
 *          7.开始初始化对象A，发现A现在开始在SingletonFactories中有，则直接获取A，把A放入EarlySingletonObjects,删除SingletonFactories中的A
 *          8.对象B的依赖注入完成
 *          9.对象B创建完成，把B放入SingletonObjects，把B从EarlySingletonObjects和SingletonFactories中删除
 *          10.对象B注入给A，继续注入A的其它依赖，直到A注入完成
 *          11.对象A创建完成，然后把A放入singletonObjects，把A从earlySingletonObjects和singletonFactories中删除
 *          12.循环依赖结束，两个对象都到了SingletonObjects中去了
 * 7.spring中AOP是怎么实现的？
 *      1.如果目标对象实现了接口，则默认使用jdk的动态代理
 *      2.如果目标对象没有实现接口，则必须采用CGLIB库
 *      3.原理
 *          1.jdk动态代理
 *              1.JDK的动态代理是通过反射类Proxy和InvocationHandler回调接口实现的，想用jdk的动态代理的类，必须要有接口
 *              2.核心是实现InvocationHandler接口，使用invoke()方法进行面向切面的处理，调用相应的通知
 *          2.cglib
 *              1.动态地去生成要代理的类的子类，子类要重写代理类的所有不是final的方法，在子类中采用方法拦截技术拦截所有父类方法的调用
 *              2.底层是利用ASM字节码处理框架生成子类的
 *              3.核心是实现MethodInterceptor接口，使用intercept()方法进行面向切面的处理，调用相应的通知
 *
 * @author
 * @created 2022/1/20 20:37
 */
public class Spring {
}
